home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1997 August / Walnut Creek CDROM.7z / VOL_400 / 466_01 / SRC / FMTEXT.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-20  |  3.7 KB  |  199 lines

  1. #include <afx.h>
  2. #include <afxtempl.h>
  3. #include "parse.h"
  4. #include "input.h"
  5. #include "fmt.h"
  6. #include "fmtExt.h"
  7. #include "errmsg.h"
  8.  
  9.  
  10.  
  11.  
  12. /******************************************************/
  13. // Tag list
  14. /******************************************************/
  15.  
  16. TAGSPEC gtagsExtSection[] =
  17. {
  18.     CFmtListExt::tagExt,           "ext",
  19.     CFmtListExt::tagGenericDelimiter, "genericdelim",
  20.     -1,        NULL,
  21. };
  22.  
  23.  
  24. TAGSPEC gtagsSrcTypes[] =
  25. {
  26.     sourceC,    "c",
  27.     sourceAsm,  "asm",
  28.     sourceBas,  "bas",
  29.     sourceGeneric, "generic",
  30.     -1,     NULL,
  31. };
  32.  
  33.  
  34. /******************************************************/
  35. // Format class
  36. /******************************************************/
  37.  
  38. CFmtExt::CFmtExt(void) : CFmtBase(3)
  39. {
  40. }
  41.  
  42.  
  43. int CFmtExt::Validate(void)
  44. {
  45.     if(m_nSrcType == sourceGeneric && m_chGenericDelim == 0)
  46.         return fmterrMissingExtensionDelim;
  47.  
  48.     return 0;
  49. }
  50.  
  51.  
  52. CFmtExt::Match(CFmtSrchBase *p)
  53. {
  54.     CFmtSrchExt *pExt = (CFmtSrchExt *)p;
  55.     
  56.     return _stricmp(m_sExt, pExt->m_sExt) == 0;
  57. }
  58.  
  59. #ifdef _DEBUG
  60. void CFmtExt::Dump(CDumpContext &dc) const
  61. {
  62.     CFmtBase::Dump(dc);
  63.  
  64.     dc << "\tExt: "<< m_sExt;
  65.     for(int i = 0; gtagsSrcTypes[i].iTag != m_nSrcType; i++)
  66.         ASSERT(gtagsSrcTypes[i].iTag != -1);
  67.  
  68.     dc << "; Type: " << m_nSrcType << "(" << gtagsSrcTypes[i].szName << ")\r\n";
  69. }
  70. #endif
  71.  
  72.  
  73.  
  74. /******************************************************/
  75. // List class
  76. /******************************************************/
  77.  
  78. TAGSPEC *CFmtListExt::FmtTagList(void)
  79. {
  80.     return gtagsExtSection;
  81. }
  82.     
  83.  
  84. int CFmtListExt::ParseEntry(CFmtInput &in)
  85. {
  86.     CFmtExt *pNew;
  87.     const char *sz;
  88.     static char szNameTerm[] = "\t ";
  89.     int nRet;
  90.         
  91.     pNew = (CFmtExt *)m_pNew;
  92.  
  93.     switch(m_nTag)
  94.     {
  95.     // Parent
  96.  
  97.     case tagExt:
  98.     {
  99.         // expect: .define=name , format string
  100.  
  101.         if(in.m_nTokens != 2)
  102.             return fmterrBadEntryCount;
  103.  
  104.         // Make a new one
  105.  
  106.         nRet = CheckAddTag();
  107.         if(nRet)
  108.             return nRet;
  109.  
  110.         m_pNew = pNew = new CFmtExt;
  111.  
  112.         m_nState.Tag = TRUE;
  113.  
  114.         // Get the Extension
  115.  
  116.         sz = EatWhite(in.m_aszTokens[0]);
  117.         if(!isalnum(*sz))
  118.             return fmterrExpectedExtension;
  119.     
  120.         const char *szEnd = SeekEnd(sz, szNameTerm, MAXTAGSIZE);
  121.         if(szEnd == NULL)
  122.             return fmterrBadTagName;
  123.  
  124.         pNew->m_sExt = CString(sz, szEnd-sz);
  125.  
  126.         // Record source file information.
  127.  
  128.         pNew->SetSource(in.m_nFile, in.m_lCurLine);
  129.         
  130.         // Set the format string.
  131.  
  132.         sz = EatWhite(in.m_aszTokens[1]);
  133.         szEnd = SeekEnd(sz, szNameTerm, MAXTAGSIZE);
  134.         if(szEnd == NULL)
  135.             return fmterrBadFilenameExtension;
  136.  
  137.         CString sName(sz, szEnd-sz);
  138.  
  139.         for(int i = 0; gtagsSrcTypes[i].iTag != -1; i++)
  140.         {
  141.             if(_stricmp(gtagsSrcTypes[i].szName, sName) == 0)
  142.             {
  143.                 pNew->m_nSrcType = gtagsSrcTypes[i].iTag;                                
  144.                 break;
  145.             }
  146.         }
  147.  
  148.         if(gtagsSrcTypes[i].iTag == -1)
  149.             return fmterrBadSrcType;
  150.  
  151.         switch(pNew->m_nSrcType)
  152.         {
  153.         case sourceC:
  154.             pNew->m_chGenericDelim = 0;
  155.             break;
  156.  
  157.         case sourceBas:
  158.             pNew->m_chGenericDelim = '\'';
  159.             break;
  160.  
  161.         case sourceAsm:
  162.             pNew->m_chGenericDelim = chSemicolon;
  163.             break;
  164.         }
  165.  
  166.         break;
  167.     }
  168.  
  169.     case tagGenericDelimiter:
  170.     {
  171.         // Validate entry.
  172.  
  173.         if(m_nState.Skip)
  174.             return 0;
  175.  
  176.         if(!m_nState.Tag)
  177.             return fmterrOrphanedTag;
  178.  
  179.         if(in.m_nTokens != 1)
  180.             return fmterrBadEntryCount;
  181.  
  182.         sz = EatWhite(in.m_aszTokens[0]);
  183.         pNew->m_chGenericDelim = *sz;
  184.  
  185.         sz = EatWhite(++sz);
  186.         if(*sz)
  187.             return fmterrInvalidCommentDelim;
  188.  
  189.         break;
  190.     }
  191.  
  192.     default:
  193.         return fmterrBadFmtEntry;
  194.     }
  195.  
  196.     return 0;
  197. }
  198.  
  199.